/*
 * ==================================================
 * 项目开发者：JerryStark
 * 开发者Email：4771007@qq.com
 * 开发者QQ:4771007
 * 开发范围：web，wap，android,ios,osx or win or linux 应用
 * ==================================================
 */
package lottery;

import RTPower.RTHttp;
import com.google.gson.Gson;
import com.google.gson.JsonObject;

/**
 * 单个彩票抓取值守类
 *
 * @author jerry
 */
public class GetOneLottery {

    /**
     * 单个彩票值守线程
     */
    public Thread LotteryThread;

    /**
     * 单个彩票线程的开关
     */
    public boolean LotteryStatus = true;
    /**
     * 游戏的标签
     */
    private String LotteryTag;

    /**
     * 游戏抓取页面的url
     */
    private String LotteryUrl;

    /**
     * 配置文件的开关状态
     */
    private String LotteryConfStatus;
    /**
     * 游戏被抓取页面的类型
     */
    private String GetType;

    /**
     * 解析规则集合
     */
    private JsonObject GetRule;

    /**
     * 初始化:
     *
     * @param game_conf 单个游戏的配置信息,单个实例使用
     */
    public GetOneLottery(JsonObject game_conf) {
        System.out.println("彩票抓取:初始化单个彩票配置信息");
        //初始化配置信息到变量
        FormatConfig(game_conf);
    }

    /**
     * 单个游戏开始抓取,值守线程
     */
    public void Start() {

        //开启线程
        LotteryThread = new Thread(() -> {
            System.out.println("彩票抓取:" + LotteryTag + "开启值守线程.....");

            //不是start就停止
            if (!LotteryConfStatus.equals("start")) {
                System.out.println(LotteryTag + ":配置文件关闭状态,结束");
                return;
            }
            //开始循环值守
            while (LotteryStatus) {
                //值守抓取的主要方法
                GetOneLotteryWeb();
                try {
                    System.out.println(LotteryTag + ":值守线程正常运行中....." + LotteryThread.getName());
                    Thread.sleep(2000);
                } catch (InterruptedException ex) {
                    System.err.println(LotteryTag + ":循环值守线程出错-死亡");
                }
            }
        });
        LotteryThread.setName(LotteryTag+"Get");
        LotteryThread.start();
    }

    /**
     * 把json对象提取,赋值给全局变量
     *
     * @param game_conf
     */
    private void FormatConfig(JsonObject game_conf) {
        //处理基本的 标签 url 和 页面类型
        LotteryTag = game_conf.get("tag").getAsString();
        LotteryUrl = game_conf.get("url").getAsString();
        LotteryConfStatus = game_conf.get("status").getAsString();
        GetType = game_conf.get("type").getAsString();

        //处理抓取规则
        GetRule = game_conf.getAsJsonObject("get_rule");

        System.out.println("彩票抓取:" + LotteryTag + "初始化配置完毕");
    }

    /**
     * 抓取网页,并进行按配置解析成规范数据
     * <br>这里使用新线程,为了防止一次抓取出错导致值守线程死掉
     */
    private void GetOneLotteryWeb() {
//使用新线程
        new Thread(() -> {
            //获取抓取的通用结果并保存
            Savedata(GetUrlhttp());

            System.out.println(LotteryTag + ":线程结束" + Thread.currentThread().getName());
        }).start();
    }

    /**
     * 正式开始抓取页面,按配置进行解析
     */
    private JsonObject GetUrlhttp() {
        RTHttp geTHttp = new RTHttp(LotteryUrl);
        String result = geTHttp.Get();

        //按照配置的类型丢给对应的
        if (result.equals("")) {
            //抓取回来是空内容就停止掉
            System.err.println(LotteryTag + ":抓取结果为空,停止任务");
            return null;
        }

        //根据配置的类型来解析内容
        System.out.println(LotteryTag + ":开始对抓取信息进行" + GetType + "解析...." + Thread.currentThread().getName());

        //准备解析过的数据对象
        JsonObject use_data = new JsonObject();
        switch (GetType) {
            case "json":
                use_data = new ScanJsonData(result, GetRule).Start();
                break;
            case "html":
                use_data = new ScanHtmlData(result, GetRule).Start();
                break;
            default:
                System.err.println(LotteryTag + ":配置的类型不存在,无法解析");
                break;
        }

        System.out.println("==================================");
        System.out.println(LotteryTag + ":最终规范数据--" + use_data);
        System.out.println("===================================");

        return use_data;
    }

    /**
     * 存储数据到全局变量,
     * <br>并检查是否有写出数据库的操作
     * <br>有的话 调用数据库存储
     *
     * @param result_data
     */
    private void Savedata(JsonObject result_data) {
        //把数据
        ResultData.Save(LotteryTag, result_data);
    }

}
